<?php
	
	$SUPERA_LIMITE_LICENCIAS = 'No se pueden agregar más técnicos. Se ha llegado al límite de licencias';
	
	$app->get('/tecnico/listar', function () use($app){
    	$app->render('../web/pages/tecnico/tecnicoListar.php');
	});
	
	$app->get('/tecnico/listarEstado', function () use($app){
    	$app->render('../web/pages/tecnico/tecnicoEstadoEmpresa.php');
	});
	
	$app->get('/tecnico/listarEstadoJson', function (){
		$response = new stdClass();	
		$page = $_GET['page']; // get the requested page 
		$limit = $_GET['rows']; // get how many rows we want to have into the grid
		$idEmpresa = $_SESSION['idEmpresa'];
    	$count = Tecnico::getCantRows($idEmpresa);
    	
    	if( $count >0 ) {
    		 $total_pages = ceil($count/$limit); 
		}else {
			 $total_pages = 1; 
		}
		if ($page > $total_pages) $page=$total_pages; 
		$start = $limit*$page - $limit; // do not put $limit*($page - 1)
		$tecnicos = Tecnico::listarInicioFin($idEmpresa,$start, $limit);
    	$i = 0;
		$response->page = $page; 
		$response->total = $total_pages; 
		$response->records = $count;
		foreach ($tecnicos as $tec) {
			$cantTareasAcep = Tarea::listarCantTareasAceptadasPorTecnico($tec->idTecnico);
			//$cantTareasAcep = 0;
			$cantTareasPend = Tarea::listarCantTareasPendientesPorTecnico($tec->idTecnico);
			$response->gridModel[$i]['duracion'] = Tarea::getTiempoTareasAsignadasPorTecnico($tec->idTecnico);
			$response->gridModel[$i]['idTecnico']=$tec->idTecnico;
			$response->gridModel[$i]['nombreApell']=$tec->nombreApell;
			$response->gridModel[$i]['cantTareasAcep']=$cantTareasAcep;
			$response->gridModel[$i]['cantTareasPend']=$cantTareasPend;
			$response->gridModel[$i]['latitud']=$tec->latitud;
			$response->gridModel[$i]['longitud']=$tec->longitud;
			$estadoTecnico = $tec->estadoTecnico()->find_one();
			if($estadoTecnico!=false){
				$response->gridModel[$i]['estado'] = $estadoTecnico->descripcion;
			}
			$i++;
		}
		echo json_encode($response);
	});
	
	$app->get('/tecnico/listarJson', function (){
		$response = new stdClass();	
		$page = $_GET['page']; // get the requested page 
		$limit = $_GET['rows']; // get how many rows we want to have into the grid
		$idEmpresa = $_SESSION['idEmpresa'];
    	$count = Tecnico::getCantRows($idEmpresa);
    	
    	if( $count >0 ) {
    		 $total_pages = ceil($count/$limit); 
		}else {
			 $total_pages = 1; 
		}
		if ($page > $total_pages) $page=$total_pages; 
		$start = $limit*$page - $limit; // do not put $limit*($page - 1)
		$tecnicos = Tecnico::listarInicioFin($idEmpresa,$start, $limit);
    	$i = 0;
		$response->page = $page; 
		$response->total = $total_pages; 
		$response->records = $count;
		foreach ($tecnicos as $tec) {
    		$response->gridModel[$i]['idTecnico']=$tec->idTecnico;
			$response->gridModel[$i]['nombreApell']=$tec->nombreApell;
			$response->gridModel[$i]['correo']=$tec->correo;
			$response->gridModel[$i]['numeroLinea']=$tec->numeroLinea;
			$usuario = $tec->usuario()->find_one();
			if($usuario!=false){
				$response->gridModel[$i]['nombreUsuario'] = $usuario->nombre;
			}
			$estadoTecnico = $tec->estadoTecnico()->find_one();
			if($estadoTecnico!=false){
				$response->gridModel[$i]['idEstado'] = $estadoTecnico->descripcion;
			}
			$i++;
		}
		echo json_encode($response);
	});
	
	$app->post('/tecnico/administrar', function () use($SUPERA_LIMITE_LICENCIAS){
		$tecnico = null;
		$idTecnico = null;
		$idUsuario = null;
		$usuario = null;
		$nombreUsuario = "";
		$idEmpresa = $_SESSION['idEmpresa'];
		$cantLicencias = Empresa::buscarEmpresa($idEmpresa)->cantLicencias;
		$cantTecnicos = Tecnico::getCantRows($idEmpresa);
		$response = new stdClass();
		if($_POST['oper'] == "add" && $cantLicencias == $cantTecnicos){
			$response->estado = "ERROR";
			$response->errores = $SUPERA_LIMITE_LICENCIAS;
			echo json_encode($response);
			return 0;
		}
		if(isset($_POST['nombreUsuario'])){
			$nombreUsuario = $_POST['nombreUsuario'];
		}
		if($_POST['oper'] != "add" && existeUsuarioRepetidoTecnico($nombreUsuario, $_POST['id'])){
			$response->estado = "ERROR";
			$response->errores = "El usuario ingresado ya está en uso";
			echo json_encode($response);
			return 0;
		}
		if($_POST['oper'] == "del" || !existeUsuarioRepetidoTecnico($nombreUsuario, $_POST['id'])){	
			if($_POST['id'] != "_empty" ){
				$idTecnico = $_POST['id'];	
			}
			//traigo la empresa
			if($_POST['oper'] != "add"){
				$tecnico = Tecnico::buscarTecnico($idTecnico);
				$usuario = $tecnico->usuario()->find_one();
			}
			if($_POST['oper'] == "edit"){
				$idUsuario = $usuario->idUsuario;
				$usuario->nombre = $_POST['nombreUsuario'];
				$usuario->save();
			}
			if($_POST['oper'] == "del"){
				Tecnico::borrarTecnico($idTecnico);
				Usuario::borrarUsuario($usuario->idUsuario);
				
			}else{
				//tecnico nuevo
				if($tecnico == null && $_POST['oper'] == "add"){
					$usuario = Model::factory('Usuario')->create();
					$usuario->nombre = $_POST['nombreUsuario'];
					$usuario->contrasenia = "12345";
					$usuario->idPerfil = 2;
					$usuario->save();
					$idUsuario = $usuario->idUsuario;
					$tecnico = Model::factory('Tecnico')->create();	
				}
				$tecnico->nombreApell = $_POST['nombreApell'];
				$tecnico->correo = $_POST['correo'];
				$tecnico->numeroLinea = $_POST['numeroLinea'];
				$tecnico->idEstadoTecnico = $_POST['idEstado'];
				$tecnico->borrado = 0;
				$tecnico->idUsuario = $idUsuario;
				$tecnico->idEmpresa= $idEmpresa;
				$tecnico->save();
				//controla si el estado es deshabilitado para rechazar las tareas pendientes, activas y asignadas
				if($tecnico->idEstadoTecnico == 2){
					$tareasReAsignadas = "";
					$tareasNoReAsignadas = "";
					$tareas = Tarea::listarTareasAsignadasPorTecnico($tecnico->idTecnico);
					foreach($tareas as $tar){
						TareaRechazada::agregarTareaRechazada($tar->idTarea, $tecnico->idTecnico, "Deshabilitación del técnico");
						if($tar->criterio == "manual"){
							$tar->idTecnico = null;
							$tar->idEstadoTarea = 5;
							$tar->save();
							$tareasNoReAsignadas = $tareasNoReAsignadas . ";" . $tar->nroOrden;
						}else{
							$respuesta = asignarTecnico($idEmpresa, $tar->idTarea, $tar->criterio);
							if($respuesta == 1){
								$tareasReAsignadas = $tareasReAsignadas . ";" . $tar->nroOrden;
							}else{
								$tar->idEstadoTarea = 5;
								$tar->idTecnico = null;
								$tar->save();
								$tareasNoReAsignadas = $tareasNoReAsignadas . ";" . $tar->nroOrden;
							}		
						}
					}
					if(count($tareas) > 0){
						$response->estado = "OK";
						$response->info = "Las siguientes tareas fueron reasignadas: " . $tareasReAsignadas . ". " 
						. "Las siguientes tareas no se pudieron reasignar: " . $tareasNoReAsignadas;
						echo json_encode($response);	
						return 1;
					}
				}
			}
		}
	});
	
	function existeUsuarioRepetidoTecnico($nombreUsuario,$idTecnico){
		$tecnico = null;
		$usuarioAux =null;
		$usuario = Usuario::buscarUsuarioPorNombre($nombreUsuario);
		if($usuario == FALSE){
			return FALSE;
		}else{
			// si es un tecnico que ya existe se controla si el usuario que se encontro es el que pertenece al tecnico
			if($idTecnico != "_empty"){
				$tecnico = Tecnico::buscarTecnico($idTecnico);
				$usuarioAux = $tecnico->usuario()->find_one();
				if($usuario->idUsuario == $usuarioAux->idUsuario){
					return FALSE;
				}else{
					return TRUE;
				}
			}else{
				// si es un tecnico nueva entonces el usuario que se encontro pertenece a otro tecnico
				return TRUE;
			}
		}	
	}
	
	function asignarTecnicoManual($idTecnico,$idTarea){
		$fecha = date('d/m/Y', time() - 60*60*3);
		$tiempoTareas = Tarea::getTiempoTareasPorTecnico($idTecnico,$fecha);
		$tarea = Tarea::buscarTarea($idTarea);
		$tiempoTar = $tarea->tipoTarea()->find_one()->duracion;
		if($tiempoTareas + $tiempoTar > 8*60){
			return 0;
		}else{
			$tarea->idTecnico = $idTecnico;
			$tarea->idEstadoTarea = 4;
			$tiempoAsignacion = date('H:i', time() - 60*60*3);
			$tarea->tiempoAsignacion = $tiempoAsignacion;
			$tarea->save();
			return 1;
		}
	}
	
	function asignarTecnico($idEmpresa,$idTarea,$criterio){
		//obtengo los tecnicos que rechazaron la tarea para no tenerlos en cuenta en la asignacion
		$idsTecnicosExcluidos = array(); 
		$tarea = Tarea::buscarTarea($idTarea);
		$tipoTarea = $tarea->tipoTarea()->find_one();
		$rechazosTecnicos = TareaRechazada::listarPorTarea($idTarea);
		$tecnicos = null;
		$i = 0;
		// se excluyen los tecnicos que rechazaron la tarea
		foreach($rechazosTecnicos as $rechazo){
			$idsTecnicosExcluidos[$i] = $rechazo->idTecnico;	
			$i++;
		}
		//se excluyen los tecnicos que estan deshabilitados
		$rechazosTecnicos = Tecnico::listarTecnicoPorEstado($idEmpresa, 2);
		foreach($rechazosTecnicos as $rechazo){
			$idsTecnicosExcluidos[$i] = $rechazo->idTecnico;	
			$i++;
		}
		//se excluyen los tecnicos que superen las 8 horas (8*60) laborales contando esta nueva tarea 
		$fecha = date('d/m/Y', time() - 60*60*3);
		$rechazosTecnicos = Tecnico::listarTecnicoPorTiempoOcupacionMayor($idEmpresa, $tipoTarea->duracion, 8*60,$fecha);
		for($j = 0; $j < count($rechazosTecnicos) ;$j++){
			$idsTecnicosExcluidos[$i] = $rechazosTecnicos[$j]->idTecnico;	
			$i++;
		}
		if($criterio == null){
			$criterio = $tarea->criterioAsignacion;
		}else{
			$tarea->criterioAsignacion = $criterio;
		}
		if($criterio == "menorDistancia"){
			//se excluyen los tecnicos que tienen alguna tarea pendiente o asignada
			$rechazosTecnicos = Tecnico::listarTecnicoConTareaAsignadaPendiente($idEmpresa);
			for($j = 0; $j < count($rechazosTecnicos) ;$j++){
				$idsTecnicosExcluidos[$i] = $rechazosTecnicos[$j]->idTecnico;	
				$i++;
			}
		}	
		$tecnicos = Tecnico::listarPorEmpresa($idEmpresa,$idsTecnicosExcluidos);	
		if(count($tecnicos) == 0){
			return 0;
		}
		$tecnicoOptimo = null;
		if($criterio == "menorTarea"){
			
			$tecnicoOptimo = seleccionMenorTarea($tecnicos);	
		}
		if($criterio == "menorOcupacion"){
			$tecnicoOptimo = seleccionMenorOcupacion($tecnicos);
		}
		if($criterio == "menorDistancia"){
			$cliente = Cliente::buscarCliente($tarea->idCliente);
			$tecnicoOptimo = seleccionMenorDistancia($tecnicos, $cliente);
		}
		if($tecnicoOptimo == null){
			return 0;
		}else{
			$tarea->idTecnico = $tecnicoOptimo->idTecnico;
			$tarea->idEstadoTarea = 4;
			$tiempoAsignacion = date('H:i', time() - 60*60*3);
			$tarea->tiempoAsignacion = $tiempoAsignacion;
			$tarea->save();
			return 1;	
		}
	}
	
	function seleccionMenorTarea($tecnicos){
		$cantTareasOptimo = 1000000;
		$tecnicoOptimo = null;
		//por cada tecnico busca las tareas que no estén terminadas
		foreach ($tecnicos as $tec) {
			$cantTareas = Tarea::listarCantTareasAsignadasAceptasPorTecnico($tec->idTecnico);
			// si encuentro un tecnico con menor tareas guardo ese tecnico y la cant de tareas
			if($cantTareas == 0){
				//si encuentro un técnico sin tareas selecciono ese
				$tecnicoOptimo = $tec;
				$cantTareasOptimo = $cantTareas;
				return $tecnicoOptimo;	
			}
			if($cantTareas < $cantTareasOptimo ){
				$tecnicoOptimo = $tec;
				$cantTareasOptimo = $cantTareas;
			}
		}
		return $tecnicoOptimo;	
	}
	
	function seleccionMenorOcupacion($tecnicos){
		$tiempoTareasOptimo = 1000000;
		$tecnicoOptimo = null;
		foreach ($tecnicos as $tec){
			$tiempoTareas = Tarea::getTiempoTareasAsignadasPorTecnico($tec->idTecnico);
			// si encuentro un tecnico con menor tareas guardo ese tecnico y la cant de tareas
			if($tiempoTareas == 0){
				//si encuentro un técnico sin tareas selecciono ese
				$tecnicoOptimo = $tec;
				$tiempoTareasOptimo = $tiempoTareas;
				return $tecnicoOptimo;	
			}
			if($tiempoTareas < $tiempoTareasOptimo ){
				$tecnicoOptimo = $tec;
				$tiempoTareasOptimo = $tiempoTareas;
			}
		}
		return $tecnicoOptimo;
	}
	
	function seleccionMenorDistancia($tecnicos,$cliente){
		$tecnicoOptimo = null;
		$valortecnicoOptimo = null;
		$valortecnico = null;
		$latitudCli = $cliente->latitud;
		$longitudCli = $cliente->longitud;
		$latitudTec = null;
		$longitudTec = null;
		foreach($tecnicos as $tec){
			if($tec->latitud != null && $tec->longitud != null){
				$latitudTec = $tec->latitud;
				$longitudTec = $tec->longitud;
				$valortecnico = sqrt(pow($latitudCli - $latitudTec, 2) + pow($longitudCli - $longitudTec, 2));
				if($valortecnicoOptimo == null || $valortecnicoOptimo > $valortecnico){
					$valortecnicoOptimo = $valortecnico;
					$tecnicoOptimo = $tec;
				}
			}
		}
		return $tecnicoOptimo;
	}

	function tecnicosDisponibles($idEmpresa,$idTipoTarea){
		$idsTecnicosExcluidos = array();
		$i = 0; 
		$tipoTarea = TipoTarea::buscarTipoTarea($idTipoTarea);
		$rechazosTecnicos = Tecnico::listarTecnicoPorEstado($idEmpresa, 2);
		foreach($rechazosTecnicos as $rechazo){
			$idsTecnicosExcluidos[$i] = $rechazo->idTecnico;	
			$i++;
		}
		//se excluyen los tecnicos que superen las 8 horas (8*60) laborales contando esta nueva tarea
		$fecha = date('d/m/Y', time() - 60*60*3);
		$rechazosTecnicos = Tecnico::listarTecnicoPorTiempoOcupacionMayor($idEmpresa, $tipoTarea->duracion, 8*60,$fecha);
		for($j = 0; $j < count($rechazosTecnicos) ;$j++){
			$idsTecnicosExcluidos[$i] = $rechazosTecnicos[$j]->idTecnico;	
			$i++;
		}
		return Tecnico::listarPorEmpresa($idEmpresa,$idsTecnicosExcluidos);
	}
	
	function tecnicosDisponiblesProxDias($idEmpresa,$idTipoTarea,$fecha){
		$idsTecnicosExcluidos = array();
		$i = 0; 
		$tipoTarea = TipoTarea::buscarTipoTarea($idTipoTarea);
		$rechazosTecnicos = Tecnico::listarTecnicoPorEstado($idEmpresa, 2);
		$tiempoTareas = $tipoTarea->duracion;
		foreach($rechazosTecnicos as $rechazo){
			$idsTecnicosExcluidos[$i] = $rechazo->idTecnico;	
			$i++;
		}
		$tareasFecha = Tarea::listarPorFecha($idEmpresa, $fecha);
		foreach($tareasFecha as $tar){
			$tiempoTareas = $tiempoTareas + $tar->tipoTarea()->find_one()->duracion;	
		}
		$cantTecnicos = Tecnico::getCantPorEmpresa($idEmpresa,$idsTecnicosExcluidos);
		if($tiempoTareas < $cantTecnicos * 8 * 60){
			return 1;
		}else{
			return 0;
		}
	}
	
?>